|
Date : 17/5/94 + 24-25/06/94 Protection : MOT DE PASSE Programme : GENESIA Outils : SOFT-ICE V2.50 + V2.64 avec EMS Fichier : GENESIA.EXE Temps pass� : 25mn + 1h Soci�t� : Micro�ds Origine : C.D. Divers : pr�trait� par STACK RIPPER Num�ro : 247 En hommage � STACK RIPPER je laisse ici son essai de crackage. Ce dernier fonctionne lors de la demande du mot de passe initial mais ne fonctionne plus lors de la seconde demande apr�s avoir restaur� un fichier sauvegard�. � Pas vraiment difficile. Il m'a suffit de tracer le programme (et � sp�cialement la routine de code), de la remonter pour arriver au � CALL responsable de l'affichage de la demande du code , et d'interver- � tir le saut d'apr�s. Bon mon p�re souhaite que je m'�tale un peu plus � donc je vais d�tailler ce crack. Apr�s l'appel de Soft-Ice, on se � trouve dans un longue boucle se terminant par un test de la touche � ENTREE (0D). On la quitte par un RETF et quelques instructions plus � tard, on parvient � un test de AX, puis forc�ment � un saut qui, si � le joueur � mal r�pondu au bout de 3 essais renvoie ce dernier au � DOS. C'est ce saut qu'il faut inverser (ou plut�t forcer). Voici � donc pour la version 640*480 : � � 15F9:010C 7503 JNZ 0111 --> devient JMP 0111 � � Et pour la version 320*200 (c'est la m�me routine, mot pour mot, mais � le fichier EXE est plus court, donc le saut de trouve avant) : � � 15F9:00E5 7503 JNZ 00EA --> devient JMP 00EA � � STACK RIPPER Lorsque l'inversion d'un saut ne donne pas l'effet escompter il faut trouver ce qui agit sur le saut. En l'occurence le contenu de AX et comment celui-ci est d�termin�. Apr�s diff�rents essais il semble que ce n'est pas suffisant. J'ai donc d�cid� de remonter � la source du probl�me. Apr�s avoir activer la touche ENTER test�e en CS:16F4 CS=4BB2 CS:16F4 807EFC0D CMP BYTE PTR [BP-04],0D CS:16F8 7403 JZ 16FD on trouve un CALL qui doit probablement test� le code entr� avec celui se trouvant en m�moire. Mais en tra�ant ce CALL on ne trouve rien. Il ne reste plus que de faire un point d'arr�t au moment o� le programme lit le code entr� pour le comparer avec celui se trouvant dans le programme. Mais on ne sait pas o� se trouve le code que l'on vient de taper. Il existe deux m�thodes pour le trouver. -1) Mettre un point d'arr�t sur le port du clavier et regarder o� le programme va mettre l'octet tap�. C'est fastidieux surtout qu'� ce niveau le caract�re est un SCAN-CODE et n'est pas en ASCII. -2) Faire une recherche de la chaine tap�e avec tous les segments ( donn�es, ES, SS et m�me CS d�s fois qu'un programmeur vicieux aurait plac� les donn�es dans le code ). Pour cel� il faut taper une chaine facilement identifiable telle que FREDDY par-exemple. Avec S DS:0 L FFFF 'FREDDY' pour les 64k du segment de donn�es. Avec S ES:0 L FFFF 'FREDDY' pour les 64k de l'extra-segment. Avec S SS:0 L FFFF 'FREDDY' pour les 64k du segment du stack. etc... Et en g�n�ral on trouve. Dans le cas pr�sent la chaine est en: ES:1FE0. Il ne suffit plus que de mettre un point d'arr�t sur la position ES:1FE0 en lecture pour trouver les instructions de comparaisons et o� se trouve la chaine � comparer. BPMB ES:1FE0 R D�s lors on trouve les instructions de comparaisons suivantes qui se trouve dans la m�me routine qui checke la demande de code au d�but du jeu que celle qui demande en cliquant sur la caserne blanche dans une sauvegarde: CS=306E CS:0012 B9FFFF MOV CX,FFFF CS:0015 F2AE REPNZ SCASB ; Cherche tant que # de AX sinon quitte. CS:0017 F7D1 NOT CX ; Cx contient la taille du mot. CS:0019 2BF9 SUB DI,CX ; On se repositionne au d�but pour... CS:001B F3A6 REPZ CMPSB ; ...comparer la chaine et on quitte si pas �gal ou si CX=0. Nota: Ces instructions sont compl�tement d�taill�es par SOURCER � la fin de ce DEP. La chaine tap�e se trouve comme suit dans ES:DI FREDDY.............. La chaine du SOFT se trouve comme suit en DS:SI MORAL.MONDE.LAC.DEST Une petite explication: Les mots ne sont pas s�par�s par des points mais par le caract�re NUL=00. PCTOOLS affiche un point lorsque le caract�re n'est pas affichable, caract�re de control, retour ligne, line feed, etc. Donc l'instruction REPNZ ( r�p�te tant que CX#0 ) SCASB ( recherche dans une chaine le caract�re qui se trouve dans AX ) Ici on a NUL dans AX soit 0000. Donc CX qui �tait � FFFF se trouve par exemple � FFFA si le mot �tait "MORAL.". En faisant un NOT CX on inverse son contenu et on trouve F-A=5 lettres. Donc CX contenant 5 on va comparer maintenant ces 5 caract�res avec REPZ CMPSB ( compare string byte ). Au fait ce programme semble avoir �t� �crit en C. Alors ici il y a plein de solutions, mais la plus simple est d'aller voir avec PCTOOLS si les chaines � comparer ne sont pas en clair dans le SOFT ! Si si �a arrive. Et je te le donne en mille. Elles sont en CLAIR dans le fichier GENESIA.EXE ! Il ne reste plus que de remplacer les 50 mots de passe structur�s comme suit: MORAL.MONDE.LAC.DESTINATION.CONSTRUIRE.etc.etc.etc. Par des zeros comme suit ( des zeros en ASCII �videmment ): 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. Ce qui donne en HEXA: 30 00 30 00 30 00 30 00 30 00 30 00 30 00 30 00 etc... Et rajouter lors de la demande de mot de passe ( puisqu'elle est en clair ) un message expliquant qu'il suffit de taper 0 et ENTER ! Les copies d'�cran ci-apr�s ont �t� faites avec CET.COM: Ci-dessous le secteur original du texte accompagnant la demande du mot de passe. Et plus loin le m�me texte modifi�. GENESIA.EXE Secteur Relatif 0000368 Groupe 38383 Sect rel disk 0614535 0032 56 34 3E 27 4D 41 4C 47 52 45 20 56 4F 53 20 51 V4>'MALGRE VOS Q 0048 55 41 4C 49 54 45 53 20 43 45 52 54 41 49 4E 45 UALITES CERTAINE 0064 53 20 45 54 20 4C 41 20 43 4F 4E 46 49 41 4E 43 S ET LA CONFIANC 0080 45 00 51 55 45 20 56 4F 55 53 20 41 43 43 4F 52 E QUE VOUS ACCOR 0096 44 45 20 4C 41 20 50 4F 50 55 4C 41 54 49 4F 4E DE LA POPULATION 0112 20 44 45 20 47 45 4E 45 53 49 41 2C 00 43 45 52 DE GENESIA, CER 0128 54 41 49 4E 53 20 44 4F 55 54 45 4E 54 20 51 55 TAINS DOUTENT QU 0144 45 20 56 4F 55 53 20 53 4F 59 45 5A 20 4C 27 48 E VOUS SOYEZ L'H 0160 45 52 49 54 49 45 52 00 44 45 20 4C 27 41 4E 43 ERITIER DE L'ANC 0176 49 45 4E 20 50 52 49 4E 43 45 2E 20 50 4F 55 52 IEN PRINCE. POUR 0192 20 4C 45 53 20 52 41 53 53 55 52 45 52 2C 00 49 LES RASSURER, I 0208 44 45 4E 54 49 46 49 45 5A 20 56 4F 54 52 45 20 DENTIFIEZ VOTRE 0224 56 45 52 53 49 4F 4E 20 43 4F 4D 4D 45 20 45 54 VERSION COMME ET 0240 41 4E 54 20 00 55 4E 20 4F 52 49 47 49 4E 41 4C ANT UN ORIGINAL 0256 2E 00 44 4F 4E 4E 45 5A 20 4C 45 20 50 52 45 4D . DONNEZ LE PREM 0272 49 45 52 20 4D 4F 54 00 50 41 47 45 3A 20 20 20 IER MOT PAGE: 0048 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0064 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0080 20 00 20 20 20 20 20 20 20 46 52 45 44 44 59 5F FREDDY_ 0096 53 4F 54 20 45 54 20 53 54 41 43 4B 20 52 49 50 SOT ET STACK RIP 0112 50 45 52 20 20 20 20 20 20 20 20 20 00 20 53 4F PER SO 0128 4E 54 20 46 49 45 52 53 20 44 45 20 56 4F 55 53 NT FIERS DE VOUS 0144 20 50 52 45 53 45 4E 54 45 52 20 43 45 20 4C 4F PRESENTER CE LO 0160 47 49 43 49 45 4C 20 00 20 20 20 20 20 20 20 53 GICIEL S 0176 41 4E 53 20 41 55 43 55 4E 45 20 50 52 4F 54 45 ANS AUCUNE PROTE 0192 43 54 49 4F 4E 2E 20 20 20 20 20 20 20 20 00 20 CTION. 0208 20 20 20 20 4A 55 53 54 45 20 54 41 50 45 5A 20 JUSTE TAPEZ 0224 5A 45 52 4F 20 45 54 20 45 4E 54 45 52 2E 20 20 ZERO ET ENTER. 0240 20 20 20 20 00 20 20 20 20 20 20 20 20 20 20 20 0256 20 00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 En fait apr�s avoir cogit� un petit moment je me suis dit: "Et si je sauvais les octets dans un fichier binaire lorsque je trouve un hit avec mon HEXUTIL afin de les dessassembler avec SOURCER ?". Aussitot dit aussitot fait. Et voil� ci-dessous le r�sultat: CS:0000 B9 FFFF mov cx,0FFFFh CS:0003 F2/ AE repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al CS:0005 F7 D1 not cx CS:0007 2B F9 sub di,cx CS:0009 F3/ A6 repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di] CS:000B 74 06 jz loc_2 ; Jump if zero CS:000D 1B C0 sbb ax,ax CS:000F F5 cmc ; Complement carry CS:0010 15 0000 adc ax,0 CS:0013 8E DA loc_2: mov ds,dx ; xref CS:000B CS:0015 5F pop di CS:0016 5E pop si CS:0017 CB retf La valeur de IP est fausse mais on s'en fout car de toute fa�on on le connait car on a trac� le programme jusqu'� cet endroit. Et d'autre part c'est juste pour avoir des commentaires sur le code et pouvoir les placer dans les DEPs. Freddy |